import tensorflow as tf
import numpy as np

## 向量基础运算
#向量reduce
a = tf.range(1,10)
tf.print(a)
tf.print(tf.reduce_sum(a))
tf.print(tf.reduce_mean(a))
tf.print(tf.reduce_max(a))
tf.print(tf.reduce_min(a))
tf.print(tf.reduce_prod(a))

#张量指定维度进行reduce
tf.print('---reduce处理---')
b = tf.reshape(a,(3,3))
tf.print(tf.reduce_sum(b, axis=1)) # 1D
tf.print(tf.reduce_sum(b, axis=1, keepdims=True)) # 保持原有的维度 2D
tf.print(tf.reduce_sum(b, axis=0, keepdims=True))

#bool类型的reduce
tf.print('bool类型的reduce')
p = tf.constant([True,False,False])
# p = tf.constant([True,True,True])
q = tf.constant([False,False,True])
tf.print(tf.reduce_all(p)) # 如果所有的数值都是True，它的返回结果True  对向量里面执行逻辑与
tf.print(tf.reduce_any(q)) # 执行逻辑或  只要一个True，它的返回结果True

#利用tf.foldr实现tf.reduce_sum
s = tf.foldr(lambda a,b:a+b,tf.range(10))
tf.print(s)

#arg最大最小值索引
a = tf.range(1,10)
tf.print(tf.argmax(a))
tf.print(tf.argmin(a))

#tf.math.top_k可以用于对张量排序
# top_k 会用在分类领域中进行处理，找出最优可能的前k个类别数据
# 如果一个向量中全部都是概率，概率越大，数值越大
# 图像，自然语言，数据挖掘
tf.print('top_k')
a = tf.constant([1,3,7,5,4,8])
values,indices = tf.math.top_k(a,3,sorted=True)
tf.print(values)# 由大到小最大的k（3）个数值
tf.print(indices) # 对应values，数值的小标
tf.print('top_k')
# 矩阵运算
#矩阵乘法
tf.print('矩阵乘法')
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[2,0],[0,2]])
tf.print('使用@处理\n', a@b)
tf.print('使用matmul处理\n', tf.matmul(a, b))

#矩阵转置
a = tf.constant([[1,2],[3,4]])
tf.print(tf.transpose(a))

# 矩阵广播
a = tf.constant([1,2,3])
b = tf.constant([[0,0,0],[1,1,1],[2,2,2]])
tf.print(b + a)  #等价于 b + tf.broadcast_to(a,b.shape)